package bomberman.modelo.items;

import org.jdom2.Element;

import bomberman.modelo.IContenible;
import bomberman.modelo.mapa.Casillero;
import bomberman.modelo.observadores.Observadores;
import bomberman.modelo.personajes.Bombita;
import bomberman.modelo.personajes.Personaje;
import fiuba.algo3.titiritero.modelo.ObjetoPosicionable;
import fiuba.algo3.titiritero.modelo.ObjetoVivo;

public abstract class Item implements ObjetoPosicionable, ObjetoVivo, IContenible {
  private int       tiempoDeDuracion;
  private Casillero ubicacion;
  private Bombita   bombita;
  
  public Item(Casillero ubicacion) {
    Observadores.notificar(this);
    this.tiempoDeDuracion = 5;
    this.ubicacion = ubicacion;
    this.ubicacion.setContenidoBajo(this);
  }
  
  public static void generarContenidoRandom(Casillero ubicacion) {
    int decididor = (int) (Math.random() * 100);
    switch (decididor) {
      case 10:
        new HabanoChala(ubicacion);
      break;
      case 40:
        new Timer(ubicacion);
      break;
      case 80:
        new BombaToleTole(ubicacion);
      break;
    }
  }
  
  @Override
  public boolean esCaminablePor(Personaje unPersonaje) {
    return unPersonaje.puedeCaminarSobre(this);
  }
  
  @Override
  public boolean esSobrevolable() {
    return true;
  }
  
  @Override
  public boolean esBalisticamentePermeable() {
    return true;
  }
  
  public abstract void activar(Bombita unBombita);
  
  public abstract void desactivar();
  
  @Override
  public void vivir() {
    this.tiempoDeDuracion--;
    if (this.tiempoDeDuracion == 0) {
      this.desactivar();
    }
  }
  
  protected void setBombita(Bombita unBombita) {
    this.bombita = unBombita;
  }
  
  protected Bombita getBombita() {
    return this.bombita;
  }
  
  public Casillero getUbicacion() {
    return this.ubicacion;
  }
  
  @Override
  public int getX() {
    return this.ubicacion.getPosicion().getHorizontal();
  }
  
  @Override
  public int getY() {
    return this.ubicacion.getPosicion().getVertical();
  }
  
  protected Element serializar(Element unItem) {
    unItem.setAttribute("TiempoDeDuracion", String.valueOf(this.tiempoDeDuracion));
    unItem.setContent(this.getUbicacion().serializarUbicacion());
    return unItem;
  }
}
